LambdaのProvisioned Concurrencyは3rd Partyツールからも既に(というかGA時点から)使えます #reinvent
先日GAになった LambdaのProvisioned Concurrencyについて補足します。Provisioned Concurrencyについてまだご存知ない方は以下の弊社岩田の記事をご覧ください。
[速報]コールドスタート対策のLambda定期実行とサヨナラ!! LambdaにProvisioned Concurrencyの設定が追加されました #reinvent
リリースノートの中にこんな記載があるのに気づかれた方はいらしゃいますでしょうか。
You can also use Provisioned Concurrency today with AWS Partner tools, including configuring Provisioned Currency settings with the Serverless Framework and Terraform, or viewing metrics with Datadog, Epsagon, Lumigo, New Relic, SignalFx, SumoLogic, and Thundra.
GAになったそのタイミングから、AWSパートナーである各種3rd PartyツールからもProvisioned Concurrencyを設定、メトリック監視できるようになっています。これらのツールのユーザーなのであれば、すぐにProvisioned Concurrencyを試すことができて非常に嬉しいですね。
各ツールのリリースノート
Serverless Framework
Terraform
Datadog
Epsagon
Lumigo
New Relic
SignalFx
- 見つけられず、、
SumoLogic
- WHAT’S NEW See what we’ve been up to at Sumo Logic
- Enable Provisioned Concurrency configurations for Lambda functions
Thundra
Terraformでやってみた
aws_lambda_provisioned_concurrency_config
というリソースが追加されています。
こんな感じのコードを書いて実行してみました。aws_lambda_provisioned_concurrency_config
は一番下に書いています。
resource aws_iam_role hello { name = "role_for_lambda" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.amazonaws.com" }, "Effect": "Allow", } ] } EOF } locals { lambda_zip_file_path = "./src/lambda_function.zip" } data archive_file lambda_src { type = "zip" source_file = "./src/index.js" output_path = local.lambda_zip_file_path } resource aws_lambda_function hello { filename = local.lambda_zip_file_path function_name = "${var.basename}-hello-world" role = aws_iam_role.hello.arn handler = "index.handler" source_code_hash = filebase64sha256(data.archive_file.lambda_src.output_path) runtime = "nodejs12.x" } resource aws_lambda_provisioned_concurrency_config hello { function_name = aws_lambda_function.hello.function_name provisioned_concurrent_executions = 1 qualifier = aws_lambda_function.hello.version }
実行すると、、
エラーになりました。
Error: error putting Lambda Provisioned Concurrency Config (lambda-provisioned-concurrency-sandbox-hello-world:$LATEST): InvalidParameterValueException: Provisioned Concurrency Configs cannot be applied to unpublished function versions.
これは、Provisioned ConcurrencyがLambdaの特定のバージョン、もしくはエイリアスに対して設定するものだからです。何もバージョン設定を行なっていなければ$LATEST
というバージョンのみが表示されますが、$LATEST
にはProvisioned Concurrencyを設定することはできません。
バージョニングを有効化したい場合はaws_lambda_function
のpublish
引数をtrueにする必要があります。 (公式リファレンスリンク )
8行目を追加しました。
resource aws_lambda_function hello { filename = local.lambda_zip_file_path function_name = "${var.basename}-hello-world" role = aws_iam_role.hello.arn handler = "index.handler" source_code_hash = filebase64sha256(data.archive_file.lambda_src.output_path) runtime = "nodejs12.x" publish = true }
一度 terraform destroy
してから再度作り直します。(terraform apply
)
実行完了しました。aws_lambda_provisioned_concurrency_config
リソース作成に3分ちょっとかかりました。結構時間かかりますね。
バージョンが作成されています。
Provisioned Concurrencyの設定ができました!
バージョン更新してみる
ちょっとNodeJSのコードを更新して新バージョンを作成してみましょう。バージョン1のProvisioned Concurrencyの設定は削除され、代わりにバージョン2のものが作成されるはずです。
結果
狙い通りバージョン2のものになりました。
エイリアス版
以下のように修正すればエイリアス版の設定もできます。
+ resource aws_lambda_alias hello_alias { + function_name = aws_lambda_function.hello.function_name + function_version = aws_lambda_function.hello.version + name = "my-hello-alias" + } resource aws_lambda_provisioned_concurrency_config hello { function_name = aws_lambda_alias.hello_alias.function_name provisioned_concurrent_executions = 1 + qualifier = aws_lambda_alias.hello_alias.name - qualifier = aws_lambda_function.hello.version }
結果
狙い通りエイリアス版になりました!